/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package SemanticoPacote;

import SemanticoPacote.TratamentoErroSemantico.ErroSemantico;
import SintaticoPacote.*;
import SintaticoPacote.TratamentoErro.ErroTabela;
import SintaticoPacote.TratamentoErro.TabelaErros;
import compilador_full.TabelaSimbolos;

/**
 *
 * @author Fernanda
 */
public class CmdDoWhile {

     cmd cmd = new cmd();


    public void sintaxeCmdDoWhile(TabelaSimbolos tabelasimbolos){
        System.out.println("IMPRIME " + tabelasimbolos.getLookahead());
        String escopo = tabelasimbolos.getEscopo();
        tabelasimbolos.soConsome(); //consome o do
            if(tabelasimbolos.getLookahead().equals("{")){
                tabelasimbolos.soConsome(); // consome o "{"
                while (verificaInicio(tabelasimbolos)) {
                        cmd.sintaxeCmd(tabelasimbolos,escopo);
                        }
                    tabelasimbolos.soConsome();//consome o "}"
            } else if (verificaInicio(tabelasimbolos)) {
                cmd.sintaxeCmd(tabelasimbolos,escopo);}

        tabelasimbolos.soConsome(); //consome while
        tabelasimbolos.soConsome(); //consome "("

        if(tabelasimbolos.getLookahead().equals("true") || tabelasimbolos.getLookahead().equals("false"))
        {
            tabelasimbolos.soConsome();
        }
        else if(tabelasimbolos.getTipo().equals("identificador") && tabelasimbolos.superLookahead(1).equals(")"))
        {
            String tipoVariavel3;
            tipoVariavel3 = tabelasimbolos.RetornaTipoDeGlobalDeclarada(tabelasimbolos.getLookahead());
            if(tipoVariavel3.equals(""))
            {
               tipoVariavel3 = tabelasimbolos.RetornaTipoDeLocalDeclarada(tabelasimbolos.getLookahead(),escopo);
            }
            if(!tabelasimbolos.verificaSeVariavelFoiDeclarada(tabelasimbolos.getLookahead())){
                        System.out.println("ERRO SEMANTICO - " + tabelasimbolos.getLookahead() + " na linha " + tabelasimbolos.getLinha() + " variável não foi declarada");
                        ErroSemantico.getInstance().getTabelaErros().add("Erro Semântico na linha " +tabelasimbolos.getLinha() + ". Descrição: Variável não foi declarada");
            }
            if(!tipoVariavel3.equals("boolean"))
            {
                System.out.println("ERRO SEMANTICO - " + tabelasimbolos.getLookahead() + " na linha " + tabelasimbolos.getLinha() + " tipo incompativel de variavel");
                ErroSemantico.getInstance().getTabelaErros().add("Erro Semântico na linha " +tabelasimbolos.getLinha() + ". Descrição: Tipo imcompativel de variável");
            }
            tabelasimbolos.soConsome(); //consome o identificador;

        }
        else
                ExpressaoLogica.expLogica(tabelasimbolos, escopo);

           tabelasimbolos.soConsome();//consome o )
    
        tabelasimbolos.soConsome(); //consome o ";"

    }
    
/**
     * Verifica se há comando(s) dentro do while
     * @param tabelasimbolos
     * @return true, se há comando dentro do while
     */
    public boolean verificaInicio(TabelaSimbolos tabelasimbolos) {
        if (tabelasimbolos.getTipo().equals("identificador") || tabelasimbolos.getLookahead().equals("*") ||
                tabelasimbolos.getLookahead().equals("scanf") || tabelasimbolos.getLookahead().equals("printf") ||
                tabelasimbolos.getLookahead().equals("if") || tabelasimbolos.getLookahead().equals("while") ||
                tabelasimbolos.getLookahead().equals("do") || tabelasimbolos.getLookahead().equals("for")) {
            return true;
        }

        return false;
    }

    public boolean verificaExpAritmetica(TabelaSimbolos tabelaSimbolos)
    {
        if(tabelaSimbolos.getTipo().equals("numero") || tabelaSimbolos.getTipo().equals("identificador"))
        {
            if(tabelaSimbolos.getTipo().equals("numero") && tabelaSimbolos.superLookahead(1).equals("+") ||
                    tabelaSimbolos.getTipo().equals("numero") && tabelaSimbolos.superLookahead(1).equals("-") ||
                    tabelaSimbolos.getTipo().equals("numero") && tabelaSimbolos.superLookahead(1).equals("*") ||
                    tabelaSimbolos.getTipo().equals("numero") && tabelaSimbolos.superLookahead(1).equals("/"))
            {
                return true;
            }
            else if(tabelaSimbolos.getTipo().equals("identificador") && tabelaSimbolos.superLookahead(1).equals("+") ||
                    tabelaSimbolos.getTipo().equals("identificador") && tabelaSimbolos.superLookahead(1).equals("-") ||
                    tabelaSimbolos.getTipo().equals("identificador") && tabelaSimbolos.superLookahead(1).equals("*") ||
                    tabelaSimbolos.getTipo().equals("identificador") && tabelaSimbolos.superLookahead(1).equals("/"))
            {
                return true;
            }

        }
        return false;
    }

    public boolean verificaChamadaDeFuncao(TabelaSimbolos tabelaSimbolos)
    {
        if(tabelaSimbolos.getTipo().equals("identificador") && tabelaSimbolos.superLookahead(1).equals("("))
        {
            return true;
        }
        return false;
    }


}
